<?php 
class Work_model extends CI_Model {
    function __construct() {
        parent::__construct();
        $this->load->database();
    }
    function get_works($pj_id){
        if(is_admin()||  is_pm($pj_id)){
            $sql = "SELECT * FROM tblworks WHERE projectid='$pj_id'";   
            return $this->db->query($sql)->result_array();
        }else {
            $pn_id = auth_id();
            $sql1 = "SELECT tblworks.id,tblworks.name,tblworks.parentid,tblmanager.id as 'managerid' FROM tblworks 
                        LEFT OUTER JOIN tblmanager ON tblworks.id = workid
                        WHERE tblworks.projectid='$pj_id' AND
                        tblworks.id IN (SELECT workid FROM tblmanager WHERE personnelid='$pn_id' AND projectid='$pj_id')
                  ";
            $arr1 = $this->db->query($sql1)->result_array();
			
            foreach ($arr1 as $a) {
                $w_parent = $a['id'];
                $sql2 = "SELECT tblworks.id ,tblworks.name,tblworks.parentid FROM tblworks                            
                            WHERE parentid ='$w_parent';
                        ";
                $arr2 = $this->db->query($sql2)->result_array();
                $arr1 = array_merge($arr1,$arr2);
            }
           
            return $arr1;
        }
        
    }
    function get_works_of_pn($pj_id,$pn_id){
        $sql = "SELECT tblworks.id,tblworks.name FROM tblmanager 
                JOIN tblworks ON tblworks.id = tblmanager.workid
                WHERE tblmanager.projectid='$pj_id' AND tblmanager.personnelid='$pn_id'
               ";
        if($this->db->query($sql)->num_rows>0){
           return $this->db->query($sql)->result_array();
        }else return null;
    }
    function is_assign($workid){
        $sql = "SELECT workid FROM tblmanager WHERE workid='$workid'";
        if($this->db->query($sql)->num_rows>0){
            return true;
        }else return false;
    }
    function is_have_child($id){
        $sql = "SELECT `id` FROM `tblworks` 
                 WHERE  `parentid`=$id";
        if($this->db->query($sql)->num_rows>0){
            return true;
        }else return false;
    }
    function get_works_free_of_project($pj_id){// Lay cac cong viec chua dc phan cong cua du an
        $sql = "SELECT tblworks.id,tblworks.name 
                 FROM tblworks 
                 WHERE tblworks.projectid=$pj_id
                 AND tblworks.id NOT IN ( SELECT workid FROM tblmanager WHERE projectid=$pj_id)";
        return $this->db->query($sql)->result_array();
    }
    function get_works_and_time_of_project_pn($pj_id,$pn_id){
        // Hàm lấy tất cả công việc hiện tại của dự án thuộc của 1 nhân viên mà
        // dự án đó là dự án truyền vào hoặc dự án có thời điểm trùng với dự án truyền vào
        $sql = "SELECT `personnelid`,tblpersonnels.name as 'personnelname',`roleid`,tblroles.name as 'rolename',tblprojects.id as 'projectid',tblprojects.name as 'projectname',tblprojects.begindate,tblprojects.enddate 
                        ,tblmanager.workid,tblworks.name as 'workname',tblworks.beginonreality,tblworks.timevalueonreality,tblworks.timeunitid,tblworks.percent
                FROM `tblmanager` 
                LEFT OUTER JOIN `tblroles` ON tblmanager.roleid = tblroles.id 
                LEFT OUTER JOIN `tblprojects` ON `projectid`=tblprojects.id 
                LEFT OUTER JOIN `tblpersonnels` ON `personnelid`=tblpersonnels.id 
                LEFT OUTER JOIN tblworks ON tblmanager.workid = tblworks.id
                WHERE tblprojects.begindate < (SELECT enddate FROM tblprojects WHERE `id`='$pj_id')
                AND tblprojects.iscomplete='0' AND personnelid='$pn_id'";
         $query = $this->db->query($sql);
         if($query->num_rows>0){
             $arr = $query->result_array();
             // Them truong thoi gian ket thuc cong viec vao mang neu co cong viec
             for($i=0;$i<count($arr);$i++){
                 if($arr[$i]['workid']!='0'){
                     $date = new DateTime($arr[$i]['beginonreality']);
                     $timeunit = $arr[$i]['timeunitid'];
                     $time = $arr[$i]['timevalueonreality'];
                     switch ($timeunit) {
                        case '1':
                            $date->modify("+$time hours");
                            break;
                        case '2':
                            $date->modify("+$time days");
                            break;
                        case '3':
                            $date->modify("+$time weeks");
                            break;
                        case '4':
                            $date->modify("+$time months");
                            break;
                        default:
                            break;
                    }
                    $arr[$i]['enddaywork'] = $date->format('Y-m-d');
                 }
             }
            return $arr;
         }
         return array();       
    }
    function is_free_with_project_pn($pj_id,$pn_id){// tuong tu ham tren nhung dem
        $sql = "SELECT  count(tblmanager.workid) as 'num'
                FROM `tblmanager` 
                LEFT OUTER JOIN `tblprojects` ON `projectid`=tblprojects.id 
                LEFT OUTER JOIN `tblpersonnels` ON `personnelid`=tblpersonnels.id 
                LEFT OUTER JOIN tblworks ON tblmanager.workid = tblworks.id
                WHERE tblprojects.begindate < (SELECT enddate FROM tblprojects WHERE `id`='$pj_id')
                AND tblprojects.iscomplete='0' AND personnelid='$pn_id'";
      $arr = $this->db->query($sql)->result_array();
      if($arr[0]['num']=='0') return true;
      return false;
    }
    function get_work($workid){
        $this->db->select();
        $this->db->from('tblworks');
        $this->db->where('id',$workid);
        $arr = $this->db->get()->result_array();
        if(count($arr)>0){
            return  $arr[0];
        }else return array();
    }
    function get_parent($workid){
        $this->db->select('parentid');
        $this->db->from('tblworks');
        $this->db->where('id',$workid);
        $arr = $this->db->get()->result_array();
        if(count($arr)>0){
            return $arr[0]['parentid'];
        }else return '0';
    }
    function get_work_of_manager($manager_id){
        $sql = "SELECT tblworks.id, tblworks.name FROM tblmanager
                JOIN tblworks ON tblmanager.workid = tblworks.id 
                WHERE tblmanager.id = '$manager_id'
               ";
        return $this->db->query($sql)->result_array();
    }
    function get_child_works_of_pn($pj_id,$pn_id){ // Ham lay tat cac cong viec con cua nhan vien
        // lay danh sach phan cong cho nhan vien
        $sql = "SELECT workid FROM tblmanager WHERE
                 tblmanager.projectid='$pj_id' AND tblmanager.personnelid='$pn_id'        
               ";
        $ids = $this->db->query($sql)->result_array();
        //print_r($ids);
        //lay ds cong viec con
        $works = array();
        foreach ($ids as $id) {
            $sql2 = "SELECT tblworks.id, tblworks.name FROM tblworks
                     WHERE parentid='".$id['workid']."' 
					 AND  tblworks.id NOT IN ( SELECT workid FROM tblmanager WHERE projectid='$pj_id' AND workid!=0)
                     ";//AND  tblworks.id NOT IN ( SELECT workid FROM tblmanager WHERE projectid=$pj_id)
            $arr = $this->db->query($sql2)->result_array();
            //print_r($sql2);
            if(count($arr)>0) {
                foreach ($arr as $v) {
                    $works[] = $v;
                }
            }
        }
        return $works;
    }
    function delete($workid){
        $this->db->delete('tblworks',array('id'=>$workid));
        $this->db->delete('tblmanager',array('workid'=>$workid));
    }
    function delete_child($parentid){
        // lay mang chua id con
        $temp = $this->db->query("SELECT `id` FROM tblworks WHERE `parentid`='$parentid'")->result_array();
        if(count($temp)>0){
            foreach ($temp as $a) {
                $this->delete($a['id']);
                $this->delete_child($a['id']);
            }
        }
    }
    function get_name($workid){
        $this->db->select('name');
        $this->db->from('tblworks');
        $this->db->where('id',$workid);
        $arr = $this->db->get()->result_array();
        return $arr[0]['name'];
    }
    
    function get_percent($workid){
        $this->db->select('percent');
        $this->db->from('tblworks');
        $this->db->where('id',$workid);
        $arr = $this->db->get()->result_array();
        return (float)$arr[0]['percent'];
    }
    function get_reportdate($workid){
        $this->db->select('reportdate');
        $this->db->from('tblworks');
        $this->db->where('id',$workid);
        $arr = $this->db->get()->result_array();
        return  $arr[0]['reportdate'];
    }
    function get_my_works($pj_id){
        $pn_id = auth_id();
        $sql = "SELECT tblmanager.workid as 'id',tblworks.name FROM tblmanager
                JOIN tblworks ON tblmanager.workid = tblworks.id
                WHERE personnelid = '$pn_id' and tblmanager.projectid = '$pj_id'
                ";
        return $this->db->query($sql)->result_array();
    }
    function get_of_project($pj_id){
         $sql = "SELECT tblmanager.workid as 'id',tblworks.name as 'name',tblpersonnels.name as 'personnelname',`roleid`,tblroles.name as 'rolename',tblprojects.id as 'projectid',tblprojects.name as 'projectname',tblprojects.enddate,tblprojects.begindate,
                       tblworks.beginonreality,tblworks.timevalueonreality,tblworks.timeunitid,tblworks.percent,tblworks.parentid
                FROM `tblmanager` 
                LEFT OUTER JOIN `tblroles` ON tblmanager.roleid = tblroles.id 
                LEFT OUTER JOIN `tblprojects` ON `projectid`=tblprojects.id 
                LEFT OUTER JOIN `tblpersonnels` ON `personnelid`=tblpersonnels.id 
                JOIN tblworks ON tblmanager.workid = tblworks.id
                WHERE  tblmanager.projectid='$pj_id'";
         $query = $this->db->query($sql);
         if($query->num_rows>0){
             $arr = $query->result_array();
             // Them truong thoi gian ket thuc cong viec vao mang neu co cong viec
             for($i=0;$i<count($arr);$i++){
                 if($arr[$i]['id']!='0'){
                     $date = new DateTime($arr[$i]['beginonreality']);
                     $timeunit = $arr[$i]['timeunitid'];
                     $time = $arr[$i]['timevalueonreality'];
                     switch ($timeunit) {
                        case '1':
                            $date->modify("+$time hours");
                            break;
                        case '2':
                            $date->modify("+$time days");
                            break;
                        case '3':
                            $date->modify("+$time weeks");
                            break;
                        case '4':
                            $date->modify("+$time months");
                            break;
                        default:
                            break;
                    }
                    $arr[$i]['enddaywork'] = $date->format('Y-m-d');
                 }
             }
            return $arr;
    }
    }
    function evm($workid,&$pb){
        $arr = $this->work_model->get_work($workid);
        if($arr['percent']==0) $arr['percent']=0.0000000000001;
         if($arr['costonreality']==0) $arr['costonreality']=0.0000000000001;
        $begin = new DateTime($arr['beginonreality']);//strtotime($arr['beginonreality']);
        $end = new DateTime($arr['beginonreality']);
        $time = $arr['timevalueonreality'];
        switch ($arr['timeunitid']) {
            case '1':
                $end->modify("+$time hours");
                break;
            case '2':
                $end->modify("+$time days");
                break;
            case '3':
                $end->modify("+$time weeks");
                break;
            case '4':
                $end->modify("+$time months");
                break;
            default:
                break;
        }
        $now = time();
        $div = ($now - $begin->getTimestamp())/($end->getTimestamp()-$begin->getTimestamp()); // thuong so thoi gian da qua
        if($div<0) $div = 1;
        $t =  date_diff($begin,$end);
        $STWP = $arr['percent']*($t->format('%R%a'))/100; // Thời gian dự trù để hoàn thành việc đã hoàn thành
        //Thời gian thực tế hoàn thành công việc đã hoàn thành
        $t = date_diff($begin,  dateNow());
        $ATWP = $t->format('%R%a');
        $BAC = round($arr['costonplan'],2);// chi phi hoan thanh theo ke hoach
        $ACWP = round($arr['costonreality'],2);// chi phi thuc te da tieu ton cho cac phan viec da lam
        $EAC = round((100*$ACWP)/($arr['percent']),2);// chi phi uoc tinh se tieu ton de hoan thanh het
        $BCWP = round($arr['percent']*$BAC/100,2);//gia tri thu dc, day la chi phi theo ly thuyet tra cho phan viec thuc te da lam
        $BCWS = round($div*$BAC,2);//chi phi ly thuyet theo thoi gian da qua
        $CV = round($BCWP - $ACWP,2);// Chỉ số đo lường chi phí
        $SV = $BCWP - $BCWS;// Chỉ số đo lường khối lượng
        $TV = $STWP - $ATWP;// Chỉ số đo lường thời gian
        if($ACWP==0) $CPI = 0;
        else $CPI = round($BCWP /$ACWP,2);// Chỉ số chi phí
        $SPI = round($BCWP/$BCWS,2);// Chỉ số tiến độ
        $str = '';
        $str .= '<p>Chỉ số BAC là : '.$BAC.'<i>(Chi phí hoàn thành theo kế hoạch)</i>';
        $str .= '<p>Chỉ số ACWP là : '.$ACWP.'<i>(Chi phí thực tế đã tiêu tốn cho các việc đã làm-------------)</i>';
        $str .= '<p>Chỉ số EAC là : '.$EAC.'<i>(Chi phí ước tính sẽ tiêu tốn cho đến khi hoàn thành)</i>';
        $str .= '<p>Chỉ số BCWP là : '.$BCWP.'<i>(Giá trị đạt được, chi phí theo lý thuyết trả cho phần việc đã làm)</i>';
        $str .= '<p>Chỉ số BCWS là : '.$BCWS.'<i>(Chi phí theo lý thuyết trả cho thời gian đã qua)</i>';
        $str .= '<p>Chi phí '.($CV<0 ? ' thâm hụt ':' còn dư ').$CV;
        if($arr['percent']<100){
            $str .= '<p>Khối lượng công việc '.($SV<0 ? ' chậm ':' vượt mức ').$SV;
            $str .= '<p>Thời gian '.($TV<0 ? 'trễ ':'sớm ').$TV.' ngày';
            $str .= "<p>Chỉ số chi phí CPI là $CPI </p>";
            $str .= "<p>Chỉ số tiến độ SPI là $SPI </p>";
            $str .= "<p>Chỉ số tình trạng công việc CSI là ".round($CPI*$SPI,2).'</p>';
            $str .= "<p style='color:#000000;font-size:1.2em;font-weight:bold'>Tình trạng công việc".($CPI*$SPI >1 ? ' chấp nhận được':' đang có vấn đề, cần khắc phục');
            $pb = $CPI*$SPI > 1 ? false:true;
        }else {
            $str .= "<p>Chỉ số chi phí CPI là $CPI </p>";
            $str .= "<p style='color:#000000;font-size:1.2em;font-weight:bold'>Công việc đã hoàn thành.";
            $pb = $CPI > 1 ? false:true;
        }
       return $str;
    }
}
?>
